﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace Db_Sqlite.Services
{
    // <summary>
    /// Excel 处理器类，提供对 Excel 文件的操作功能
    /// 后期绑定方式实现，避免直接引用 Excel COM 库
    /// sheet获取失败，不可用
    internal class ExcelProcessor 
    {
        private object _excelApp;
        private object _workbook;
        private object _worksheet;

        public static bool IsExcelInstalled()
        {
            try
            {
                // 尝试创建 Excel 应用实例（后期绑定）
                var excelApp = Activator.CreateInstance(
                    Type.GetTypeFromProgID("Excel.Application"));
                Marshal.ReleaseComObject(excelApp);
                return true;
            }
            catch (COMException ex) when (IsExcelNotFoundError(ex))
            {
                // 捕获 Excel 未安装的特定异常
                return false;
            }
            catch
            {
                // 其他异常（如权限问题）
                return false;
            }
        }

        private static bool IsExcelNotFoundError(COMException ex)
        {
            // 根据错误代码判断是否为 Excel 未安装
            const int CO_E_CLASSNOTREG = unchecked((int)0x80040154); // 类未注册
            const int HRESULT_FROM_WIN32 = unchecked((int)0x80070005); // 通用访问拒绝

            return ex.ErrorCode == CO_E_CLASSNOTREG || ex.HResult == HRESULT_FROM_WIN32;
        }


        private static void ShowInstallationPrompt()
        {
            var msg = new StringBuilder();
            msg.AppendLine("检测到以下问题：");
            msg.AppendLine("- 未安装 Microsoft Excel");
            msg.AppendLine("- 或 Excel 运行时组件缺失");
            msg.AppendLine();
            msg.AppendLine("解决方案：");
            msg.AppendLine("1. 下载完整版 Office：");
            msg.AppendLine("   https://www.microsoft.com/microsoft-365");
            msg.AppendLine("2. 安装 Excel 运行时（仅限企业用户）：");
            msg.AppendLine("   https://aka.ms/ExcelRuntime");
            MessageBox.Show(msg.ToString(), "功能不可用", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }




        public void ProcessExcel(string filePath, Dictionary<string, int> dic)
        {
            if (!IsExcelInstalled())
            {
                // 提示用户安装 Excel
                ShowInstallationPrompt();
                return;
            }

            try
            {
                // 1. 创建 Excel 应用实例（后期绑定）
                _excelApp = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
                _excelApp.GetType().InvokeMember("Visible", BindingFlags.SetProperty, null, _excelApp, new object[] { true });

                // 2. 打开工作簿
                _workbook = _excelApp.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, _excelApp, null);
                _workbook.GetType().InvokeMember("Open", BindingFlags.InvokeMethod, null, _workbook,
                    new object[] { filePath, Missing.Value, Missing.Value });

                // 3. 获取第一个工作表
                _worksheet = _workbook.GetType().InvokeMember("sheets", BindingFlags.GetProperty, null, _workbook, null);
                _worksheet = _worksheet.GetType().InvokeMember("Item", BindingFlags.InvokeMethod, null, _worksheet, new object[] { 1 });

                // 4. 轮询 D 列（列索引从 1 开始）
                int rowCount = GetRowCount();
                for (int row = 2; row <= rowCount; row++) // 假设首行为标题
                {
                    // 读取 D 列值
                    object dCellValue = GetCellValue(row, 4); // D 列是第4列

                    // 判断逻辑（示例：D 列值为 "完成" 时标记）
                    object eCellValue = dic.ContainsKey(dCellValue.ToString()) ? "是" : "否";

                    // 写入 E 列
                    SetCellValue(row, 5, eCellValue); // E 列是第5列
                }
            }
            catch (COMException ex)
            {
                // 捕获 COM 异常并显示错误信息
                MessageBox.Show($"Excel 处理出错：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                // 捕获其他异常并显示错误信息
                MessageBox.Show($"处理出错：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                // 5. 释放资源
                ReleaseObject(_worksheet);
                ReleaseObject(_workbook);
                _excelApp.GetType().InvokeMember("Quit", BindingFlags.InvokeMethod, null, _excelApp, null);
                ReleaseObject(_excelApp);
            }
        }

        private int GetRowCount()
        {
            object usedRange = _worksheet.GetType().InvokeMember("UsedRange", BindingFlags.GetProperty, null, _worksheet, null);
            return (int)usedRange.GetType().InvokeMember("Rows", BindingFlags.GetProperty, null, usedRange, null);
        }

        private object GetCellValue(int row, int col)
        {
            return _worksheet.GetType().InvokeMember("Cells", BindingFlags.GetProperty, null, _worksheet,
                new object[] { row, col });
        }

        private void SetCellValue(int row, int col, object value)
        {
            object cell = _worksheet.GetType().InvokeMember("Cells", BindingFlags.GetProperty, null, _worksheet,
                new object[] { row, col });
            cell.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, cell, new object[] { value });
        }

        private void ReleaseObject(object obj)
        {
            if (obj != null)
            {
                try
                {
                    obj.GetType().InvokeMember("Release", BindingFlags.InvokeMethod, null, obj, null);
                }
                catch { }
                obj = null;
            }
        }


    }
}
